/*
 * BackgroundImage.java 8 juin 07
 *
 * Sweet Home 3D, Copyright (c) 2007 Emmanuel PUYBARET / eTeks <info@eteks.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package com.eteks.sweethome3d.model;

import java.awt.geom.Point2D;
import java.io.Serializable;

/**
 * The image displayed in background of the plan.
 * @author Emmanuel Puybaret
 */
public class BackgroundImage implements Serializable
{
	private static final long serialVersionUID = 1L;
	
	private final Content image;
	private final float scaleDistance;
	private final float scaleDistanceXStart;
	private final float scaleDistanceYStart;
	private final float scaleDistanceXEnd;
	private final float scaleDistanceYEnd;
	private final float xOrigin;
	private final float yOrigin;
	private final boolean invisible;
	
	/**
	 * Creates a visible background image.
	 */
	public BackgroundImage(Content image, float scaleDistance, float scaleDistanceXStart, float scaleDistanceYStart,
			float scaleDistanceXEnd, float scaleDistanceYEnd, float xOrigin, float yOrigin)
	{
		this(image, scaleDistance, scaleDistanceXStart, scaleDistanceYStart, scaleDistanceXEnd, scaleDistanceYEnd,
				xOrigin, yOrigin, true);
	}
	
	/**
	 * Creates a background image.
	 * @since 1.8
	 */
	public BackgroundImage(Content image, float scaleDistance, float scaleDistanceXStart, float scaleDistanceYStart,
			float scaleDistanceXEnd, float scaleDistanceYEnd, float xOrigin, float yOrigin, boolean visible)
	{
		this.image = image;
		this.scaleDistance = scaleDistance;
		this.scaleDistanceXStart = scaleDistanceXStart;
		this.scaleDistanceYStart = scaleDistanceYStart;
		this.scaleDistanceXEnd = scaleDistanceXEnd;
		this.scaleDistanceYEnd = scaleDistanceYEnd;
		this.xOrigin = xOrigin;
		this.yOrigin = yOrigin;
		// Use an invisible field instead of a visible field to get a default false value
		// for images created before version 1.8
		this.invisible = !visible;
	}
	
	/**
	 * Returns the image content of this background image.
	 */
	public Content getImage()
	{
		return this.image;
	}
	
	/**
	 * Returns the distance used to compute the scale of this image.
	 */
	public float getScaleDistance()
	{
		return this.scaleDistance;
	}
	
	/**
	 * Returns the abcissa of the start point used to compute 
	 * the scale of this image.
	 */
	public float getScaleDistanceXStart()
	{
		return this.scaleDistanceXStart;
	}
	
	/**
	 * Returns the ordinate of the start point used to compute 
	 * the scale of this image.
	 */
	public float getScaleDistanceYStart()
	{
		return this.scaleDistanceYStart;
	}
	
	/**
	 * Returns the abcissa of the end point used to compute 
	 * the scale of this image.
	 */
	public float getScaleDistanceXEnd()
	{
		return this.scaleDistanceXEnd;
	}
	
	/**
	 * Returns the ordinate of the end point used to compute 
	 * the scale of this image.
	 */
	public float getScaleDistanceYEnd()
	{
		return this.scaleDistanceYEnd;
	}
	
	/**
	 * Returns the scale of this image.
	 */
	public float getScale()
	{
		return getScale(this.scaleDistance, this.scaleDistanceXStart, this.scaleDistanceYStart, this.scaleDistanceXEnd,
				this.scaleDistanceYEnd);
	}
	
	/**
	 * Returns the scale equal to <code>scaleDistance</code> divided
	 * by the distance between the points 
	 * (<code>scaleDistanceXStart</code>, <code>scaleDistanceYStart</code>)
	 * and (<code>scaleDistanceXEnd</code>, <code>scaleDistanceYEnd</code>).
	 */
	public static float getScale(float scaleDistance, float scaleDistanceXStart, float scaleDistanceYStart,
			float scaleDistanceXEnd, float scaleDistanceYEnd)
	{
		return (float) (scaleDistance
				/ Point2D.distance(scaleDistanceXStart, scaleDistanceYStart, scaleDistanceXEnd, scaleDistanceYEnd));
	}
	
	/**
	 * Returns the origin abscissa of this image.
	 */
	public float getXOrigin()
	{
		return this.xOrigin;
	}
	
	/**
	 * Returns the origin ordinate of this image.
	 */
	public float getYOrigin()
	{
		return this.yOrigin;
	}
	
	/**
	 * Returns <code>true</code> if this image is visible in plan.
	 * @since 1.8
	 */
	public boolean isVisible()
	{
		return !this.invisible;
	}
}
